[毎日Kotlin] Day3. Named arguments(名前付き引数)
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
問題
3日目は、名前付き引数を使ってみる問題です。
Default and named arguments help to minimize the number of overloads and improve the readability of the function invocation. The library function joinToString is declared with default values for parameters:
fun joinToString( separator: String = ", ", prefix: String = "", postfix: String = "", /* ... */ ): String
It can be called on a collection of Strings. Specifying only two arguments make the function joinOptions() return the list in a JSON format (e.g., "[a, b, c]")
fun joinOptions(options: Collection<String>) = options.joinToString(TODO())
狙い
ここで考えて欲しい問題の意図はなんだろうか?
Javaにはなかった、名前付き引数を使ってみます。もちろん、引数の順番で渡すことも可能です。引数の順番を覚えないといけなかったのが、定義順ではなく、意図通りの順番で引数に渡すことができるので読みやすくなり便利になります。
解答例
何も省略しないで、名前付き引数を使った場合
fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", separator = ", ", postfix = "]")
すでにデフォルト値が入っているものを考慮した場合
joinToString - Kotlin Programming Language
public fun <T> Iterable<T>.joinToString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): String { return joinTo(StringBuilder(), separator, prefix, postfix, limit, truncated, transform).toString() }
separatorのデフォルトが", "になっているため、省略可能。
fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", postfix = "]")
名前付き引数を使わない場合
定義の順番通りに引数を渡す
fun joinOptions(options: Collection<String>) = options.joinToString(", ", "[", "]")
名前付き引数を順不同にわたす
以下すべて正解です。コード上の問題はないが、人間が理解し難いため、意図が伝わるように渡したほうが読みやすい。
[a, b, c]と出力したいので[,]の順番だと読みやすい。
fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", separator = ", ", postfix = "]")
fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", postfix = "]", separator = ", ")
fun joinOptions(options: Collection<String>) = options.joinToString(separator = ", ", prefix = "[", postfix = "]")
fun joinOptions(options: Collection<String>) = options.joinToString(postfix = "]", separator = ", ", prefix = "[")
fun joinOptions(options: Collection<String>) = options.joinToString(postfix = "]", prefix = "[", separator = ", ")
あとがき
Day4.でまたお会いしましょう。